package org.example.singletonPattern;

/**
 * 双重检查锁单例
 * 优点：线程安全，延迟初始化，性能好
 * 缺点：实现稍复杂
 *
 * ✅ 高并发环境下的延迟加载（如分布式缓存、线程池）
 * ✅ 初始化成本高的大型对象（避免启动卡顿）
 * ⛔ JDK < 5 版本需避免（旧版JVM的volatile实现问题）
 *
 */
public class DoubleCheckedSingleton {
    // 使用volatile保证多线程环境下的可见性和有序性
    private static volatile DoubleCheckedSingleton instance;

    private DoubleCheckedSingleton() {
        System.out.println("双重检查锁单例实例被创建");
    }

    public static DoubleCheckedSingleton getInstance() {
        // 第一次检查：避免不必要的同步
        if (instance == null) {
            // 同步代码块
            synchronized (DoubleCheckedSingleton.class) {
                // 第二次检查：确保只有一个实例被创建
                if (instance == null) {
                    instance = new DoubleCheckedSingleton();
                }
            }
        }
        return instance;
    }

    public void showMessage() {
        System.out.println("这是双重检查锁单例的方法调用");
    }
}